package it.apiconsulting.live.controller;


import it.apiconsulting.live.model.Categoria;
import it.apiconsulting.live.model.Prodotto;
import it.apiconsulting.live.util.HibernateUtil;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.classic.Session;


public class ProdottoManager extends HibernateUtil {

	public Prodotto add(Prodotto prodotto) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		session.save(prodotto);
		session.getTransaction().commit();
		return prodotto;
	}
	
	public Prodotto update(Prodotto prodotto) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		session.update(prodotto);
		session.getTransaction().commit();
		return prodotto;
	}
	
	public Prodotto delete(Long id) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		Prodotto prodotto = (Prodotto) session.load(Prodotto.class, id);
		if(null != prodotto) {
			session.delete(prodotto);
		}
		session.getTransaction().commit();
		return prodotto;
	}

	public List<Prodotto> list() {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Prodotto> prodotti = null;
		List<Categoria> categorie = null;
		try {
			
			Query query = session.createQuery("from Prodotto");
			prodotti = (List<Prodotto>)query.list();
			
			Query queryCategory = session.createQuery("from Categoria");
			categorie = (List<Categoria>)queryCategory.list();
			
			for ( int i = 0; i < prodotti.size(); i++ ){
				for ( int j = 0; j < categorie.size(); j++ ){
					if ( prodotti.get(i).getIdcategoria().equals(categorie.get(j).getId()) ) {
						prodotti.get(i).setNomecategoria(categorie.get(j).getNome() );
						break;
					}
				}
			}
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
		session.getTransaction().commit();
		return prodotti;
	}
	
	public List<Prodotto> distinctList() {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Prodotto> prodotti = new ArrayList<Prodotto>();
		List<Prodotto> prodottiFilter = new ArrayList<Prodotto>();
		List<Categoria> categorie = new ArrayList<Categoria>();
		try {
			
			Query query = session.createQuery("from Prodotto");
			prodotti = (List<Prodotto>)query.list();
			
			for (Prodotto prodotto : prodotti) 
				if (!prodottiFilter.contains(prodotto)) prodottiFilter.add(prodotto);
			
			Query queryCategory = session.createQuery("from Categoria");
			categorie = (List<Categoria>)queryCategory.list();
			
			for ( int i = 0; i < prodottiFilter.size(); i++ ){
				for ( int j = 0; j < categorie.size(); j++ ){
					if ( prodottiFilter.get(i).getIdcategoria().equals(categorie.get(j).getId()) ) {
						prodottiFilter.get(i).setNomecategoria(categorie.get(j).getNome() );
						break;
					}
				}
			}
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
		session.getTransaction().commit();
		return prodottiFilter;
	}
	
	public Prodotto getProductById(Long idProdotto) {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		Prodotto prodotto = null;
		try {
			
			Query query = session.createQuery("from Prodotto where id = "+ idProdotto);
			prodotto = (Prodotto)query.uniqueResult();
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
		session.getTransaction().commit();
		return prodotto;
	}
	
	public List<Prodotto> listByIdCategoria(Long idCategoria) {
		
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		session.beginTransaction();
		List<Prodotto> prodotti = null;
		try {
			
			Query query = session.createQuery("from Prodotto where idcategoria = " + idCategoria);
			prodotti = (List<Prodotto>)query.list();
			
		} catch (HibernateException e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}
		session.getTransaction().commit();
		return prodotti;
	}
}
